#pragma once
#include <string>
#include <vector>
#define GLFW_INCLUDE_VULKAN
#include <GLFW/glfw3.h>
#include <vulkan/vulkan.h>

#define DEBUG_MODE false

class VK_ValidationLayer;
class VK_Window
{
public:
    static VK_Window *getInstance();
    ~VK_Window();
public:
    VkInstance createOrGetVulkanInstance();
    VK_ValidationLayer *getValidationLayer()const;

    GLFWwindow *createWindow(const std::string &title);
    VkSurfaceKHR getSurface();

    GLFWwindow *getWindow()const;
    std::vector<const char *> getVulkanRequiredExtensions();
private:
    VK_Window();

    const uint32_t width = 800;
    const uint32_t height = 640;

    VkInstance vulkanInstance = nullptr;
    VK_ValidationLayer *validationLayer = nullptr;

    GLFWwindow *window = nullptr;
    VkSurfaceKHR surface = nullptr;
};
